﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class Maker {
public:
	Maker() {
		cout << "无参构造函数" << endl;
	}
	Maker(int a) {
		cout << "有参构造函数" << endl;
		this->a = a;
	}
	Maker(const Maker &m) {
		cout << "拷贝构造函数" << endl;
		a = m.a;
	}
	~Maker() {
		cout << "析构函数" << endl;
	}
private:
	int a;
};
// 拷贝构造函数的调用时机有哪些？
// 1.对象以值传递方式作为函数参数 
void func(Maker m) { // 传参过程就是一个赋值过程，等效于：Maker m = m1; 

}

void test01() {
	Maker m1;
	func(m1);
}

// 2.用一个已有对象初始化另一个对象 
void test02() {
	Maker m1;
	Maker m2(m1);
}

// 3. 函数的局部对象以值的方式从函数返回 
// vs Debug模式下，会调用拷贝构造函数
// vm Release模式下，不会调用拷贝构造函数，为了节约内存，局部对象会被保留 
Maker func2() {
	Maker m;
	cout << "函数局部对象地址：" << &m << endl; // 010FFAC4 
	return m;
}

void test03() {
	Maker m = func2();
	cout << "函数返回对象地址：" << &m << endl; // 010FFBBC 
}

int main()
{

	// test01(); 
	test03(); 

	system("pause");
	return EXIT_SUCCESS;
}